//
// Created by 86178 on 2025-04-08.
//

#ifndef DATA_STRUCT_CODE_DOUBLELINKLIST_H
#define DATA_STRUCT_CODE_DOUBLELINKLIST_H

// 双向链表节点结构
struct DNode {
    int data;
    DNode* prev;
    DNode* next;

    DNode(int val) : data(val), prev(nullptr), next(nullptr) {}
};

class DoubleLinkList {
public:
    DoubleLinkList();                   // 构造函数
    ~DoubleLinkList();                  // 析构函数，释放内存

    // 插入与删除
    void PushFront(int val);           // 头插
    void PushBack(int val);            // 尾插
    void PopFront();                   // 删除头节点
    void PopBack();                    // 删除尾节点

    void Insert(int pos, int val);     // 在位置 pos 插入（pos 从 1 开始）
    void Remove(int val);              // 删除第一个等于 val 的节点
    void RemoveAll(int val);           // 删除所有等于 val 的节点

    // 查找与访问
    bool Find(int val) const;          // 查找 val 是否存在
    int  Get(int pos) const;           // 获取 pos 位置的值
    void Set(int pos, int val);        // 修改 pos 位置的值

    // 链表状态
    int  Size() const;                 // 获取长度
    bool Empty() const;                // 是否为空
    void Clear();                      // 清空链表

    // 打印链表
    void PrintForward() const;         // 正向打印
    void PrintBackward() const;        // 反向打印（从尾到头）

private:
    DNode* head_;                      // 指向头节点
    DNode* tail_;                      // 指向尾节点
    int size_;                         // 链表长度
};



#endif //DATA_STRUCT_CODE_DOUBLELINKLIST_H
